#include "GUI.h"
#include <Pt.h>

#include "Samolot.h"

GUI * GUI::Instance = NULL;

int automat ( PtWidget_t *a, void *b,PtCallbackInfo_t *c){
	GUI * gui=(GUI *) b;
	LLotnisko * lot=gui->lotnisko;
	
	if (((PtOnOffButtonCallback_t *)(c->cbdata))->state==1)
	lot->wlaczAutooperatora();
	else
	lot->wylaczAutooperatora();
	
	//WLASCIWIE TO KAMIL NIECH TO OPISZE.
	
	return 1;
}


   
void* itemListy2t(void * str){
	GUI * gui=GUI::Instance;
	LLotnisko * lot=gui->lotnisko;
	
	char * item = (char*) str;


PtEnter(0);
	PtWidget_t * tree2= gui->getTree2();
	PtListDeleteAllItems( tree2);
	PtLeave(0);
	
	if (!(lot->get_autooperator()))
	{
		if (strcmp(item,"Mozesz ladowac")==0){ 
			cout<<"laduje "<<gui->temp_numer<<endl;
			lot->wyladujSamolot(gui->temp_numer, true);
		}
		if (strcmp(item,"Zakaz ladowania 30 s")==0){
			lot->zakazWyladowania(gui->temp_numer, 30);
		}
		if (strcmp(item,"Zakaz ladowania 60s")==0){
			lot->zakazWyladowania(gui->temp_numer, 60);
		}
		if (strcmp(item,"Wybierz inne lotnisko")==0){
			lot->odeslijSamolot(gui->temp_numer);
		}
		if (strcmp(item,"Mozesz startowac")==0){
			lot->wystartujSamolot(gui->temp_numer, true);
		}
		if (strcmp(item,"Zakaz startowania 30 s")==0){
			lot->zakazStartu(gui->temp_numer, 30);
		}
		if (strcmp(item,"Zakaz startowania 60s")==0){
			lot->zakazStartu(gui->temp_numer, 60);
		}
		if (strcmp(item,"Laduj awaryjnie")==0){
			
			lot->wyladujSamolot(gui->temp_numer, true);
		}
	}

}

int itemListy2 ( PtWidget_t *a, void *b,PtCallbackInfo_t *c){
	GUI * gui=(GUI *) b;
	LLotnisko * lot=gui->lotnisko;

	pthread_attr_t attr;

 	pthread_attr_init( &attr );
 	pthread_attr_setdetachstate(
 	&attr, PTHREAD_CREATE_DETACHED );	
pthread_create( NULL, &attr, &itemListy2t, (void*) ((PtListCallback_t *)(c->cbdata))->item );
}


int  itemListy ( PtWidget_t *a, void *b,PtCallbackInfo_t *c){
	GUI * gui=(GUI *) b;
	gui->temp_numer=atoi(((PtListCallback_t *)(c->cbdata))->item);
	PtWidget_t * tree2= gui->getTree2();
	PtListDeleteAllItems( tree2);


	LLotnisko * lot=gui->lotnisko;
	if (!(lot->get_autooperator())){
		//czy awaria
		if(gui->lotnisko->listaSamolotow[atoi(((PtListCallback_t *)(c->cbdata))->item)]->awaria && 
					gui->lotnisko->listaSamolotow[atoi(((PtListCallback_t *)(c->cbdata))->item)]->getStatus()
								==chceLadowac){
	
			if(gui->lotnisko->listaSamolotow[atoi(((PtListCallback_t *)(c->cbdata))->item)]->getPas() && 
					gui->lotnisko->get_ile_szerokich_wolnych()>0){
				
				const char * item [1]={"Laduj awaryjnie"};
				PtListAddItems(tree2, item, 1, 0);
			}
			else if(!(gui->lotnisko->listaSamolotow[atoi(((PtListCallback_t *)(c->cbdata))->item)]->getPas()) && 
				gui->lotnisko->get_ile_waskich_wolnych()>0){
				
				const char * item [1]={"Laduj awaryjnie"};
				PtListAddItems(tree2, item, 1, 0);
			}
			else{
				const char * item [1]={"Brak pasow"};
				PtListAddItems(tree2, item, 1, 0);
			}	
		}
		//ELSE
		else if( gui->lotnisko->listaSamolotow[atoi(((PtListCallback_t *)(c->cbdata))->item)]->getStatus()
				==chceLadowac){
		//czy szeroki?
			if(gui->lotnisko->listaSamolotow[atoi(((PtListCallback_t *)(c->cbdata))->item)]->getPas() && 
				gui->lotnisko->get_ile_szerokich_wolnych()>0){
			
				const char * item [4]={"Mozesz ladowac","Zakaz ladowania 30 s","Zakaz ladowania 60s", "Wybierz inne lotnisko"};
				PtListAddItems(tree2, item, 4, 0);
			}
			//jesli waski
			else if(!(gui->lotnisko->listaSamolotow[atoi(((PtListCallback_t *)(c->cbdata))->item)]->getPas()) && 
				gui->lotnisko->get_ile_waskich_wolnych()>0){
				
				const char * item [4]={"Mozesz ladowac","Zakaz ladowania 30 s","Zakaz ladowania 60s", "Wybierz inne lotnisko"};
				PtListAddItems(tree2, item, 4, 0);
			}
			else{
				const char * item [3]={"Zakaz ladowania 30 s","Zakaz ladowania 60s", "Wybierz inne lotnisko"};
				PtListAddItems(tree2, item, 3, 0);
			}
		}//if koluje lub chceLadowac
	
		//ELSE
		//if chce startowac.
		else if(gui->lotnisko->listaSamolotow[atoi(((PtListCallback_t *)(c->cbdata))->item)]->getStatus()
				==chceStartowac)	{
	
			if(gui->lotnisko->listaSamolotow[atoi(((PtListCallback_t *)(c->cbdata))->item)]->getPas() && 
					gui->lotnisko->get_ile_szerokich_wolnych()>0){
	
					const char * item [3]={"Mozesz startowac","Zakaz startowania 30 s","Zakaz startowania 60s"};
					PtListAddItems(tree2, item, 3, 0);
			}
	
			//jesli waski
			else if(!(gui->lotnisko->listaSamolotow[atoi(((PtListCallback_t *)(c->cbdata))->item)]->getPas()) && 
					gui->lotnisko->get_ile_waskich_wolnych()>0){
				
					const char * item [3]={"Mozesz startowac","Zakaz startowania 30 s","Zakaz startowania 60s"};
					PtListAddItems(tree2, item, 3, 0);
			}
			else{
			
					const char * item [2]={"Zakaz startowania 30 s","Zakaz startowania 60s"};
					PtListAddItems(tree2, item, 2, 0);
			}
		}
		else{
		
			const char * item [1]={"Nic nie robie"};
			PtListAddItems(tree2, item, 1, 0);
		}
	}
	return Pt_CONTINUE;
 }


GUI::GUI(LLotnisko * lotenko) 
{

	lotenko->gui = this;
	lotnisko=lotenko;

	Instance=this;

	//Tworzenie okna.
 	dim.w=600;
	dim.h=600;
 	PtSetArg(&argwindow[0], Pt_ARG_DIM,&dim,0);
 	PtSetArg(&argwindow[1], Pt_ARG_WINDOW_TITLE, "Modul Hefajstos" , 0);
	
	//tworzenie gridu
	dim.w=420;
	dim.h=420;
	PtSetArg(&arggrid[0], Pt_ARG_DIM,&dim,0);
	PtSetArg(&arggrid[1], Pt_ARG_GRID_VERTICAL,21,0);
	PtSetArg(&arggrid[2], Pt_ARG_GRID_HORIZONTAL,21,0);
	pol.x=10;
	pol.y=10;
	PtSetArg(&arggrid[3], Pt_ARG_POS,&pol,0);
	
	//koniec.
 	window = PtCreateWidget(PtWindow, Pt_NO_PARENT, 2, argwindow);
 	grid = PtCreateWidget(PtGrid, window,4, arggrid);

   
   //tree
	pol.x=440;
	pol.y=10;
	PtSetArg(&argtree[0], Pt_ARG_POS,&pol,0);
 	dim.h=400;
 	dim.w=200;
 	PtSetArg(&argtree[1], Pt_ARG_DIM,&dim,0);
     
	PtSetArg(&argtree[2],Pt_ARG_SELECTION_MODE, Pt_SINGLE_MODE,0);
   
	tree= PtCreateWidget(PtList, window,4, argtree);



	//tree 2

	pol.x=650;
 	pol.y=10;
 	PtSetArg(&argtree2[0], Pt_ARG_POS,&pol,0);
 	dim.h=400;
	dim.w=200;
	PtSetArg(&argtree2[1], Pt_ARG_DIM,&dim,0);
   
  // char * items="lipa";
   
 	PtSetArg(&argtree2[2],Pt_ARG_SELECTION_MODE, Pt_SINGLE_MODE,0);
  // PtSetArg(&argtree2[3], Pt_ARG_ITEMS, &items, 1);
   
	tree2= PtCreateWidget(PtList, window,3, argtree2);






//Prawdziwy hardcore programisty - wskaznik na funkcje. 
//int itemListy (PtWidget_t *a, void *b,PtCallbackInfo_t *c)=&itemListy;

	PtAddCallback(tree, Pt_CB_SELECTION,itemListy, this);
	PtAddCallback(tree2, Pt_CB_SELECTION,itemListy2, this);
      
     //tworzenie etykiet
	pol.x=850;
 	pol.y=160;
	PtSetArg(&argetykieta[0], Pt_ARG_POS,&pol,0);
	PtSetArg(&argetykieta[1],Pt_ARG_LABEL_TYPE,Pt_Z_STRING,0 );
	PtSetArg(&argetykieta[2],Pt_ARG_TEXT_STRING,"Ile wolnych pasow szerokich: ",0);
	etykieta=PtCreateWidget(PtLabel, window,3, argetykieta);
  
	PhArea_t polprogres = { { 850, 190 }, { 150, 20 } };

	PtSetArg(&argprogres[1],Pt_ARG_GAUGE_VALUE,lotnisko->get_ile_szerokich_wolnych(),0);
	PtSetArg(&argprogres[2],Pt_ARG_MAXIMUM,lotnisko->get_ile_szerokich_pasow(),0);
	PtSetArg(&argprogres[3],Pt_ARG_GAUGE_FLAGS, 81,499 );
	PtSetArg(&argprogres[0], Pt_ARG_AREA, &polprogres, 0 );
	
	progres=PtCreateWidget( PtProgress, window, 4, argprogres );


	pol.x=850;
	pol.y=250;
	PtSetArg(&argetykieta2[0], Pt_ARG_POS,&pol,0);
	PtSetArg(&argetykieta2[1],Pt_ARG_LABEL_TYPE,Pt_Z_STRING,0 );
	PtSetArg(&argetykieta2[2],Pt_ARG_TEXT_STRING,"Ile wolnych pasow waskich: ",0);
	etykieta2=PtCreateWidget(PtLabel, window,3, argetykieta2);

	PhArea_t polprogres2 = { { 850, 280 }, { 150, 20 } };

	PtSetArg(&argprogres2[1],Pt_ARG_GAUGE_VALUE,lotnisko->get_ile_waskich_wolnych(),0);
	PtSetArg(&argprogres2[2],Pt_ARG_MAXIMUM,lotnisko->get_ile_waskich_pasow(),0);
	PtSetArg(&argprogres2[3],Pt_ARG_GAUGE_FLAGS, 81,499 );
	PtSetArg(&argprogres2[0], Pt_ARG_AREA, &polprogres2, 0 );
	
	progres2=PtCreateWidget( PtProgress, window, 4, argprogres2); 
      
	//BUTTON




	PhArea_t polbutton = { { 850, 100 }, { 100, 27 } };
	
	PtSetArg(&argbutton[0], Pt_ARG_AREA, &polbutton, 0 );
	PtSetArg(&argbutton[1], Pt_ARG_TEXT_STRING, "Automat", 0 );
		
      
      button=PtCreateWidget( PtOnOffButton, window, 2, argbutton); 
      PtAddCallback(button, Pt_CB_ONOFF_NEW_VALUE,automat, this);
      
      
      
	PtRealizeWidget(window);
      
}




void GUI::dodajdoListy_a(Samolot * samolot){

	char items [3] ;
	itoa( samolot->getID(), items, 10);
	const char * i = items;
	const char * * item= &i;
	PtListAddItems( tree, item, 1, 0);
}

int  kliknietySamolot ( PtWidget_t *a, void *b,PtCallbackInfo_t *c){

	GUI * gui=(GUI *)b;
	LLotnisko * lotnisko=gui->lotnisko;
	PtWidget_t * tree=gui->getTree();
	PtWidget_t * tree2=gui->getTree2();
	int pomoc=-1;

	PtListDeleteAllItems( tree2);
	for (int i=0;i<N;i++){

		if(lotnisko->listaSamolotow[i]!=NULL){
  
 			if(a==lotnisko->listaSamolotow[i]->getIkonka())
 				pomoc=i;
	
		}
	}

	if (pomoc != -1){
		char napis [3] ;
		itoa(lotnisko->listaSamolotow[pomoc]->getID(), napis, 10);
		cout << "BLA35\n";
		int pos=PtListItemPos(tree, (const char *)napis) ;
		PtListSelectPos( tree, pos );
		
	}
	else
		cout << "ERROR: Nie znalazl ikonki na liscie samolotow\n";


	return Pt_CONTINUE;
 }


PtWidget_t * GUI::getSamolotIkonka(){

	PtWidget_t * samolot;
	dim.w=dim.h=20;
																														cout<<"gsi"<<endl;
	PtArg_t    argellipse[4];
	PtSetArg(&argellipse[0], Pt_ARG_DIM,&dim,0);
	PtSetArg(&argellipse[1], Pt_ARG_INSIDE_COLOR, Pg_RED,0);
																														cout<<"gsi2"<<endl;
	PtSetArg(&argellipse[2], Pt_ARG_FLAGS, 128,193595294);
	samolot = PtCreateWidget(PtRect, grid, 3, argellipse);
																														cout<<"gsi3"<<endl;
	   PtAddCallback(samolot, Pt_CB_ARM ,kliknietySamolot, this);
																														cout<<"gsi4"<<endl;
	
	return samolot;

}

void GUI::rysuj(PtWidget_t * ikonka){
	PtRealizeWidget(ikonka);
}


void GUI::zniknij(PtWidget_t *ikonka){
	PtUnrealizeWidget(ikonka);
}


void GUI::zmienPolozenie(PtWidget_t * ikonka, Polozenie polozenie){
	cout<<"lotnisko szer: "<<lotnisko->get_szerokosc()<<endl;
	cout<<"lotnisko dl: "<<lotnisko->get_dlugosc()<<endl;
	cout<<"samolot szer: "<<polozenie.polozenieX<<endl;
	cout<<"samolot dl: "<<polozenie.polozenieY<<endl;
	
	float alat=M_PI*polozenie.polozenieX/180;
	float alon=M_PI*polozenie.polozenieY/180;
	float blat=M_PI*lotnisko->get_szerokosc()/180;
	float blon=M_PI*lotnisko->get_dlugosc()/180;
	
	float dlat=blat-alat;
	float dlon=alon-blon;
	cout << dlat << " " << dlon << "\n";
	
	float dist_N=6378000.0*dlat;
	float dist_E=6378000.0*cos(blat)*dlon;
	cout << dist_N << " " << dist_E << "\n";
	float odleglosc=sqrt(dist_N*dist_N+dist_E*dist_E);
	cout<<"odleglosc "<<(int)odleglosc<<endl;
	pol.x=9  + (short int)(10 + (dist_E/lotnisko->zasieg*10))*20;
	pol.y=9  + (short int)(10 + (dist_N/lotnisko->zasieg*10))*20;

	PtEnter(0);
	
	
/*	if ((int)odleglosc<R/20){
		cout<<"ZNIKAM IKONKE - ZA BLISKO"<<endl;
		zniknij(ikonka);
	}
	else
*/
     if ((int)odleglosc<R/10){

		PtSetResource( ikonka, Pt_ARG_POS, &pol, 0 );
		PtSetResource(ikonka, Pt_ARG_INSIDE_COLOR, Pg_GREEN,0);
		rysuj(ikonka);
	}
	else
	if (lotnisko->zasieg>(int)odleglosc)	{

		PtSetResource(ikonka, Pt_ARG_INSIDE_COLOR, Pg_RED,0);
		PtSetResource( ikonka, Pt_ARG_POS, &pol, 0 );
		rysuj(ikonka);
	}
	else{

		zniknij(ikonka);
	}


	PtLeave(0);
}



PtWidget_t * GUI::getTree2(){
	return tree2;
}
 

PtWidget_t * GUI::getTree(){
	return tree;
}
 
void GUI::rysujPaski(){
PtEnter(0);
 	PtSetResource( progres2, Pt_ARG_GAUGE_VALUE,lotnisko->get_ile_waskich_wolnych(),0);
	PtSetResource( progres, Pt_ARG_GAUGE_VALUE,lotnisko->get_ile_szerokich_wolnych(),0);
PtLeave(0); 
}

void GUI::zniknijzListy(int id)
{
char items [3] ;
	itoa( id , items, 10);
	const char * i = items;
int pozycja= PtListItemPos( tree, (const char *) i );
	PtListDeleteAllItems( tree2);
PtListDeleteItemPos( tree, 1, pozycja );

}
